package com.wfh.mianshiji.ai.agent;

import com.wfh.mianshiji.ai.advisor.MyLoggerAdvisor;
import com.wfh.mianshiji.ai.model.StructedBean;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

/**
 * @Title: ResultAnalysisAgent
 * @Author wangfenghuan
 * @Package com.wfh.mianshiji.ai.agent
 * @Date 2025/11/3 09:45
 * @description: 结果分析智能体
 */
@Component
@Scope("prototype")
public class ResultAnalysisAgent {

    private final ChatClient chatClient;

    @Resource
    private ToolCallback[] alltools;

    public ResultAnalysisAgent(
            @Qualifier("openAiChatModel")
            ChatModel chatModel
            ) { // ← 直接通过构造函数注入
        ClassPathResource fileSystemResource = new ClassPathResource("prompt/resuleanalysis.txt");
        this.chatClient = ChatClient.builder(chatModel)
                .defaultSystem(fileSystemResource)
                .defaultAdvisors(
                        // MessageChatMemoryAdvisor.builder(analysisDbChatMemory).build(),
                        new MyLoggerAdvisor()
                ).defaultAdvisors()
                .build();
    }

    /**
     * 基础流式对话
     * @param message
     * @param interviewId
     * @return
     */
    public StructedBean doChat(String message, String interviewId) {
        BeanOutputConverter<StructedBean> converter = new BeanOutputConverter<>(StructedBean.class);
        // 开启日志
        // .advisors( // RagCustomAdvisorFactory.createRagAdvisor(pgVectorVectorStore, "实践"))
        // 使用bean结构化输出转换器
        // 开启日志
        return chatClient
                .prompt("""
        你是一名专业的数据分析师，请根据用户的简历和本次面试的对话记录，生成结构化分析结果（所有的分析结果一定要根据候选人实际的表现来评判，不要看简历上写的有多好，完全靠面试的表现评判！！！）。
        要求包含以下字段：
        - skills: 面试中候选人所表现出来的专业技能（如果不行就直接说能力不行类似的话）
        - suggestions: 面试改进建议
        - comment: 综合评价
        - interviewGrade: 面试得分（0-100 的整数）（分数尽量往低了打！！！）
        - echartsCode: 一个可用于 ECharts 渲染的图表配置对象（必须是合法 JSON 对象）
        
                        请严格以纯 JSON 格式输出，不要包含任何额外文本、解释或 Markdown。并将分析结果使用PDF生成工具写入到文件，文件内容不是JSON对象（正常字符串）
        """)
                .user(message)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, interviewId)
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
                // 开启日志
                .advisors(new MyLoggerAdvisor())
                .tools(alltools)
                // .advisors( // RagCustomAdvisorFactory.createRagAdvisor(pgVectorVectorStore, "实践"))
                // 使用bean结构化输出转换器
                .call() .entity(converter);

    }

}
